// 补充： 实时信号处理的基本使用

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

static void sig_oth(int signo, siginfo_t *psiginfo, void *ctx) {
  printf("sig_oth %d\n", psiginfo->si_value.sival_int);
}

#define C_RT_SIG SIGRTMIN + 2
int main() {

  struct sigaction act;
  act.sa_flags = 0;
  act.sa_flags |= SA_SIGINFO;
  sigemptyset(&act.sa_mask);
  act.sa_sigaction = sig_oth;
  sigaction(C_RT_SIG, &act, NULL);
  sigset_t mask, oldmask;
  sigemptyset(&mask);
  sigaddset(&mask, C_RT_SIG);
  sigprocmask(SIG_BLOCK, &mask, &oldmask);
  sigval_t val;
  // 在实时信号阻塞期间多次发送信号
  for (int i = 0; i < 5; i++) {
    val.sival_int = i;
    sigqueue(getpid(), C_RT_SIG, val);
  }
  sigprocmask(SIG_SETMASK, &oldmask, NULL);
  fflush(NULL);
}

/*
实时信号
实时信号是由Posix标准引入的，信号的取值区间是SIGRTMIN~SIGRTMAX (signal real-time min)。如在arm linux中，SIGRTMIN在signal.h中定义为32，而SIGRTMAX是64。
但是要注意，一般libc会对SIGRTMIN进行修改，保留几个预设的值用于pthread内部，比如glibc就保留了3个值。所以在使用实时信号的时候，应该使用SIGRTMIN+n/SIGRTMAX-n的方式，而不是直接使用数值。
实时信号和标准信号的优先级，在posix中是未定义的，一般来说会优先处理标准信号。

和标准信号的比较：
实时信号和标准信号不一样，实时信号标准没有其定义明确的语义，由使用者自己来决定实时信号的使用。
进程可以接受多个同样的实时信号，而标准信号不能，在标准信号没有得到处理的时候，多个标准信号会被合为一个，实时信号内核可以对其进行排队。
实时信号使用sigqueue发送的时候，可以携带附加的数据(int或者pointer)
实时信号有时序和优先级，所以相同实时信号会按次序（generated ordered）被处理（delivered）。
不同信号按信号优先级高的优先处理，数值越低的信号其优先级越高，在处理的时候，也是数值低的实时信号优先得到处理。
实时信号的默认动作是结束进程。
————————————————
版权声明：本文为CSDN博主「sky-Z」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/ykdsea/article/details/46969677
 */